const isObject = val => val!==null && typeof val==='object'

export function reactive(target) {

  // 如果target不是对象, 直接原样返回
  if (!isObject(target)) return target
  
  // 包含监视回调的处理器对象
  const handler = {
    get: function(target, key) {
      console.log(`监视到读取${key}属性, 在此收集/追踪依赖`) // track
      const result = Reflect.get(target, key)
      return isObject(result) ? reactive(result) : result    // 懒代理: 只有读取到属性值对象才会创建对应的代理返回
    },
    set: function(target, key, value) {
      // 如果值没有变, 直接返回
      const oldValue = Reflect.get(target, key)
      if (oldValue===value) return true

      const result = Reflect.set(target, key, value)
      if (result) {
        console.log(`监视到修改或添加${key}属性, set在此派发/触发更新`) // trigger
      }
      return result
    },
    deleteProperty: function(target, key) {
     
      const result = Reflect.deleteProperty(target, key)
      if (result) {
        console.log(`监视到删除${key}属性, delete在此派发/触发更新`)
      }
      return result
    }
  }

  return new Proxy(target, handler)
}
